package com.cmsz.paydemo.util;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class XmlUtils {

	public static final String UTF8_ENCODING = "UTF-8";

	/**
	 * 以字符串查找的试获取xml文本中节点的值
	 * 
	 * @param nodeStart
	 *            节点开始标签 eg :&lt;TransactionID&gt;
	 * @param nodeEnd
	 *            节点结束标签 eg :&lt;/TransactionID&gt;
	 * @param src
	 *            原字符串
	 * @return
	 */
	public static String parseNodeValueFromXml(String nodeStart, String nodeEnd, String src) {
		int nodeStartLength = nodeStart.length();
		int start = src.indexOf(nodeStart);
		int end = src.indexOf(nodeEnd);
		if (start > -1 && end > -1) {
			return src.substring(start + nodeStartLength, end);
		}
		return "";
	}

	/**
	 * <p>
	 * 获取xml字符串中指定节点的值，对应节点中可能包含&lt;![CDATA[xxxx]]&gt;的(如：&lt;attach&gt;&lt; ![
	 * CDATA[支付测试]] &gt;&lt;/attach&gt;)使用此函数<br>
	 * 确定节点不包含&lt;![CDATA[xxxx]]&gt;建议使用 函数parseNodeValueFromXml
	 * </p>
	 * 
	 * @param nodeStart
	 *            节点开始标签 eg : &lt;TransactionID&gt;
	 * @param nodeEnd
	 *            节点结束标签 eg : &lt;/TransactionID&gt;
	 * @param src
	 *            原字符串
	 * @return
	 */
	public static String getNodeValueFromXml(String nodeStart, String nodeEnd, String src) {
		String rtnStr = "";
		int nodeStartLength = nodeStart.length();
		int start = src.indexOf(nodeStart);
		int end = src.indexOf(nodeEnd);
		if (start > -1 && end > -1) {
			// 先从xml字符串中截取出对应节点的内容
			rtnStr = src.substring(start + nodeStartLength, end);
		}
		rtnStr = rtnStr.substring(9, rtnStr.lastIndexOf("]]>"));
		return rtnStr;
	}

	/**
	 * 获取xml字符串中指定节点的值，对应节点中可能包含"&lt;![CDATA[xxxx]]>"的(如：
	 * <attach>&lt;![CDATA[支付测试]]></attach>)使用此函数<br>
	 * 确定节点不包含"&lt;![CDATA[xxxx]]>"建议使用 函数parseNodeValueFromXml
	 * 
	 * @param nodeName
	 *            节点名字eg： xml
	 * @param xmlStr
	 *            原字符串
	 * @return
	 */
	public static String getNodeValueFromXml(String nodeName, String xmlStr) {
		String nodeStart = "<" + nodeName + ">";
		String nodeEnd = "</" + nodeName + ">";
		return getNodeValueFromXml(nodeStart, nodeEnd, xmlStr);
	}

	/**
	 * 替换xml中节点的值，只适合替换报文中只有一个指定名字的节点
	 * 
	 * @param nodeStart
	 *            节点开始标签 eg :&lt;TransactionID>
	 * @param nodeEnd
	 *            节点结束标签 eg :&lt;/TransactionID>
	 * @param relacement
	 *            节点替换的内容
	 * @param xml
	 *            原字符串
	 * @return
	 */
	public static String relaceNodeContent(String nodeStart, String nodeEnd, String relacement, String xml) {
		int nodeStartLength = nodeStart.length();
		int start = xml.indexOf(nodeStart);
		int end = xml.indexOf(nodeEnd);

		if (start > -1 && end > -1) {
			String segStart = xml.substring(0, start + nodeStartLength);
			String segEnd = xml.substring(end, xml.length());
			return segStart + relacement + segEnd;
		}
		return xml;
	}

	/**
	 * 去除xmlStr报文中A节点下的数据用B节点替换，主要用于去除“&lt;![CDATA[&lt;?xml version="1.0"
	 * encoding="UTF-8"?>”和 “]]>”
	 * 
	 * @param xmlStr
	 *            原xml字符串
	 * @param fromSta
	 *            开始节点
	 * @param fromEnd
	 *            结束节点
	 * @param toSta
	 *            开始节点
	 * @param toEnd
	 *            结束节点
	 * @return
	 */
	public static String parseElement(String xmlStr, String fromSta, String fromEnd, String toSta, String toEnd) {
		// 替换的数据
		String rspStr = parseNodeValueFromXml(fromSta, fromEnd, xmlStr);
		rspStr = fromSta + rspStr + fromEnd;
		// 将xmlStr数据下to节点中的数据用中rspStr数据替换
		String newXmlStr = relaceNodeContent(toSta, toEnd, rspStr, xmlStr);
		return newXmlStr;
	}

	/**
	 * 去除报文中的空格、回车、换行符、制表符
	 * 
	 * @param str
	 * @return
	 */
	public static String replaceBlank(String str) {
		String dest = "";
		if (str != null) {
			Pattern p = Pattern.compile("\\s*|\t|\r|\n");
			Matcher m = p.matcher(str);
			dest = m.replaceAll("");
			dest = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + dest.substring(36);
		}
		return dest;
	}

}
